//package cn.lsj.order.test;//package cn.lsj.order.test;
//
//import org.apache.commons.io.FileUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.*;
//import java.nio.file.*;
//import java.security.InvalidKeyException;
//import java.security.NoSuchAlgorithmException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.ExecutionException;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;
//
///**
// * @className: ZipDemo2
// * @description: TODO  类描述
// * @author: liangshijie
// * @date: 2023/5/22
// **/
//
//@Service
//public class ZipDemo2 {
//
//    @Autowired
//    private MinioClient minioClient;
//
//    @Autowired
//    private ThreadPoolExecutor threadPoolExecutor;
//
//
//    public void downloadAndCompressFiles(Map<String, List<String>> fileToFolderMap, HttpServletResponse response) throws IOException, ExecutionException, InterruptedException {
//        //  创建临时目录来存储文件
//        Path tempDirPath = Files.createTempDirectory("files");
//        try {
//            List<CompletableFuture<Void>> futureList = new ArrayList<>();
//
//            //  使用线程池异步下载文件
//            for (Map.Entry<String, List<String>> entry : fileToFolderMap.entrySet()) {
//                String folderName = entry.getKey();
//                List<String> filenames = entry.getValue();
//
//                Path folderPath = tempDirPath.resolve(folderName);
//                Files.createDirectories(folderPath);
//
//                for (String filename : filenames) {
//                    Path outputPath = folderPath.resolve(filename);
//
//                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
//                        try (InputStream inputStream = minioClient.getObject(
//                                GetObjectArgs.builder()
//                                        .bucket("your-bucket-name")
//                                        .object(filename)
//                                        .build())) {
//                            Files.copy(inputStream, outputPath);
//                        } catch (IOException | IllegalArgumentException
//                                 | InvalidKeyException | NoSuchAlgorithmException e) {
//                            //  处理异常
//                        }
//                    }, threadPoolExecutor);
//                    futureList.add(future);
//                }
//            }
//
//            //  等待线程池中的任务全部完成
//            CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).join();
//
//            //  设置响应头，告诉客户端要下载的文件类型为ZIP
//            response.setContentType("application/zip");
//            response.setHeader("Content-Disposition", "attachment;  filename=\"files.zip\"");
//
//            //  获取响应输出流
//            try (OutputStream outputStream = response.getOutputStream();
//                 ZipOutputStream zipOut = new ZipOutputStream(outputStream)) {
//                //  压缩临时目录下的所有文件夹
//                zipDir(tempDirPath.toString(), tempDirPath.toString(), zipOut);
//            }
//        } finally {
//
//            try {
//                //  创建WatchService对象，监控tempDirPath目录下的文件变化
//                WatchService watchService = FileSystems.getDefault().newWatchService();
//                tempDirPath.register(watchService, StandardWatchEventKinds.ENTRY_DELETE);
//
//                //  删除临时目录及其内容
//                FileUtils.deleteDirectory(tempDirPath.toFile());
//
//                //  循环监听tempDirPath目录下的文件是否被占用
//                while (true) {
//                    WatchKey key = watchService.take();
//                    for (WatchEvent<?> event : key.pollEvents()) {
//                        //  如果有文件被删除，则判断是否是上一步删除的目录，如果是则关闭WatchService并结束监听
//                        Path deletedPath = (Path) event.context();
//                        if (tempDirPath.resolve(deletedPath).equals(tempDirPath)) {
//                            key.cancel();
//                            watchService.close();
//                            return;
//                        }
//                    }
//                    key.reset();
//                }
//            } catch (IOException | InterruptedException e) {
//                //  处理异常
//            }
//
//        }
//    }
//
//
//    private void zipDir(String filePath, String prefix, ZipOutputStream zipOut) throws IOException {
//        File file = new File(filePath);
//        File[] files = file.listFiles();
//
//        if (files == null) {
//            return;
//        }
//
//        for (File f : files) {
//            String name = f.getName();
//
//            //如果是文件夹，继续递归
//            if (f.isDirectory()) {
//                zipDir(f.getAbsolutePath(), prefix, zipOut);
//                continue;
//            }
//
//            //如果是文件，进行压缩
//            FileInputStream fis = new FileInputStream(f);
//            ZipEntry zipEntry = new ZipEntry(f.getAbsolutePath().substring(prefix.length() + 1));
//            zipOut.putNextEntry(zipEntry);
//
//            byte[] buffer = new byte[4096];
//            int bytesRead;
//            while ((bytesRead = fis.read(buffer)) != -1) {
//                zipOut.write(buffer, 0, bytesRead);
//            }
//
//            fis.close();
//        }
//    }
//
//
//}
